package ControleAcademico.Model.Dao;

import java.io.*;
import java.util.ArrayList;

import ControleAcademico.Model.Pojo.Aluno;
import ControleAcademico.Model.Pojo.Atividade;
import ControleAcademico.Model.Pojo.Disciplina;
import ControleAcademico.Model.Pojo.Faltas;
import ControleAcademico.Model.Pojo.HistoricoAtividade;
import ControleAcademico.Model.Pojo.HistoricoDisciplina;
import ControleAcademico.Model.Pojo.Professor;
import ControleAcademico.Model.Pojo.Turma;

public class DisciplinaImpl implements DisciplinaDao{

	private ArrayList<Disciplina> listaDeDisciplinas = null;
	private ProfessorImpl professorImpl;
	private TurmaImpl turmaImpl;
	private HistoricoDisciplinaImpl historicoDisciplinaImpl;
		
	public DisciplinaImpl () {
		listaDeDisciplinas = new ArrayList<Disciplina>();
	}

	@Override
	public void salvar (Disciplina disciplina, int flag) {
		
		try{
			if (flag != -1) {
				listaDeDisciplinas.add(disciplina);
			} else {
				PrintWriter p = new PrintWriter("Disciplinas.txt");
				System.out.println(listaDeDisciplinas.size());

				for(Disciplina disciplinas : listaDeDisciplinas){
					p.write(disciplinas.getId()+"\t");
					p.write(disciplinas.getNome()+"\t");
					p.write(disciplinas.getEmenta()+"\t");
					p.write(disciplinas.getCargaHoraria()+"\t");
					p.write(disciplinas.getNumeroTurmasOferecidas()+"\t");
					p.write ("Turmas\t");
					
					for(Turma i : disciplinas.getTurma()){
						p.write(i.getId()+"\t");
					}
								
					p.write ("HistoricoDisciplina\t");
	
					for(HistoricoDisciplina i : disciplinas.getHistoricosDisciplina()){
						p.write(i.getId()+"\t");
					}
					
					p.write ("Professores\t");
					
					for(Professor i : disciplinas.getProfessores()){
						p.write(i.getId()+"\t");
					}
					p.write("#");
					p.write("\n");
				}
				p.close();
			}
		}catch(Exception e){
			
		}
	}		

	public ArrayList<Disciplina> getListaDeDisciplinas(){
		return listaDeDisciplinas;
	}
	
	public Disciplina pesquisarArquivo(int id){
		String linha;
		Disciplina disciplina = null;

		try{
			FileReader reader = new FileReader("Disciplinas.txt");    	
	        BufferedReader leitor = new BufferedReader(reader);
	        
	        while ((linha = leitor.readLine()) != null) {
	        	String[] dados = linha.split("\t");

	        	if(Integer.parseInt(dados[0])==id){
	        		disciplina = new Disciplina(dados[1],dados[2],Integer.parseInt(dados[3]),id);
	        		return disciplina;
	        	}
	        }
		}catch(Exception e){
			
		}
        return disciplina;
	}
	
	@Override
	public void carregar() {
		
	      String linha = null; 
	      
	      try {  
	    	 FileReader reader = new FileReader("Disciplinas.txt");    	
	         BufferedReader leitor = new BufferedReader(reader);  
	         Professor professor;
	         Turma turma = null;
	         Disciplina disciplina = null;
	         HistoricoDisciplina historicoDisciplina;  
	         
	         // loop que percorrerá todas as  linhas do arquivo.txt que eu quero ler  
	         while ((linha = leitor.readLine()) != null) {  
	            String[] dados = linha.split("\t"); 
	            int identificador = Integer.parseInt(dados[0]);

	            if (!this.pesquisarNaListaImpl(Integer.parseInt(dados[0]))){
	            	disciplina = new Disciplina (dados[1], dados[2], Integer.parseInt(dados[3]), Integer.parseInt(dados[0]));
	            	int i = 5;
	            	
	            	while (!(dados[i].equals("HistoricoDisciplinas"))) { 
	            		if(!turmaImpl.pesquisarNaListaImpl(Integer.parseInt(dados[i]))){
		            		turma = turmaImpl.pesquisarArquivo(Integer.parseInt(dados[i]));
		            		turmaImpl.adicionarTurma(turma);
		            	} else {
		            		for (Turma k : turmaImpl.getTurmas()) {
								if (k.getId() == identificador){
									turma = k;
									break;
								}
							}
		            	}
		            	disciplina.adicionarTurma(turma);
		            	i++;
		            }
		            i++;

		            while (!(dados[i].equals("Professores"))) { 
		            	historicoDisciplina = historicoDisciplinaImpl.pesquisarHistoricoDisciplina(Integer.parseInt(dados[i]));
		            	disciplina.adicionarHistoricoDisciplina(historicoDisciplina);
		            	i++;
		            }
		            i++;
		            
		            while (!(dados[i].equals("#"))) { 
		            	professor = professorImpl.pesquisarArquivo(Integer.parseInt(dados[i]));
		            	professorImpl.adicionarProfessor(professor);
		            	disciplina.adicionarProfessor(professor);
		            	i++;
		            }
		            
		            listaDeDisciplinas.add(disciplina);
	            }else{
	            	
	            	for (Disciplina k : listaDeDisciplinas) {
						if (k.getId() == identificador){
							disciplina = k;
						}
					}
	            	
	            	int i = 5;
	            	
	            	while (!(dados[i].equals("HistoricoDisciplinas"))) { 
	            		if(!turmaImpl.pesquisarNaListaImpl(Integer.parseInt(dados[i]))){
		            		turma = turmaImpl.pesquisarArquivo(Integer.parseInt(dados[i]));
		            		turmaImpl.adicionarTurma(turma);
		            	}else{
		            		for (Turma k : turmaImpl.getTurmas()) {
								if (k.getId() == identificador){
									turma = k;
									break;
								}
							}
		            	}
		            	disciplina.adicionarTurma(turma);
		            	i++;
		            }
		            i++;
		            
		            while (!(dados[i].equals("Professores"))) { 
		            	historicoDisciplina = historicoDisciplinaImpl.pesquisarHistoricoDisciplina(Integer.parseInt(dados[i]));
		            	disciplina.adicionarHistoricoDisciplina(historicoDisciplina);
		            	i++;
		            }
		            i++;
		            
		            while (!(dados[i].equals("#"))) { 
		            	professor = professorImpl.pesquisarArquivo(Integer.parseInt(dados[i]));
		            	professorImpl.adicionarProfessor(professor);
		            	disciplina.adicionarProfessor(professor);
		            	i++;
		            }
	            }
	         }  
	         leitor.close();  
	         reader.close();  
	      } catch (Exception e) {
	    	  
	      }  
	  }

	public void setTurmaImpl(TurmaImpl turmaImpl) {
		this.turmaImpl = turmaImpl;
	}

	public void setProfessorImpl(ProfessorImpl professorImpl) {
		this.professorImpl = professorImpl;
	}
	
	public void setHistoricoDisciplinaImpl (HistoricoDisciplinaImpl historicoDisciplinaImpl) {
		this.historicoDisciplinaImpl = historicoDisciplinaImpl;
	}
	
	public void adicionarDisciplina(Disciplina disciplina){
		this.listaDeDisciplinas.add(disciplina);
	}
	
	public boolean pesquisarNaListaImpl(int id){
		for (Disciplina disciplina: listaDeDisciplinas) {
			if (disciplina.getId() == id){
				return true;		
			}
		}
		return false;
	}
	
	public Disciplina pesquisarDisciplina(int id){
		Disciplina disciplina = null;
		for (Disciplina i : listaDeDisciplinas) {
			if (i.getId() == id){
				disciplina = i;
				return disciplina;		
			}
		}
		return disciplina;
	}
}